﻿///注意:下面的代码有问题，不能用于实际项目中


//初始化大小为1，

//最大线程数量
using System.Threading;

int maxCount = 2;
object lockObj = new object();
bool isFirstRelease = false;

Semaphore printSemaphore = new Semaphore(1, 2);

for (int i = 1; i <= 10; i++)
{
    Thread t = new Thread(PrintWork);
    t.Start(i);
}

void PrintWork(object? obj)
{
    string threadId = obj.ToString();
    string currentTime;

    while (true)
    {
        currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffffff");
        Console.WriteLine($"{currentTime}------线程:{obj} 等待打印...");
        printSemaphore.WaitOne();

        try
        {
            currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffffff");
            Console.WriteLine($"{currentTime}------线程:{obj},开始打印工作....");
            Thread.Sleep(2000);
        }
        finally
        {
            //释放
            ReleaseCount();
        }
    }
}

void ReleaseCount()
{
    //使用Semaphore的Release方法返回值可间接获取当前许可数
    lock (lockObj)
    {
        try
        {
            //如果是第一次，就释放最大值，让可同时使用的线程数达到最大
            if (!isFirstRelease)
            {
                printSemaphore.Release(maxCount);
            }
            else
            {
                //后续就只释放一个
                printSemaphore.Release();
            }
        }
        //释放的数量超过了maxCount会报这个异常
        catch (SemaphoreFullException ex)
        {
            isFirstRelease = true;
            Console.WriteLine($"释放失败最大值={maxCount}");
        }
    }
}